// 知识点1：定义行为像指针的类，在不想使用shared_ptr的情况下我们可以使用引用计数来确定是否释放内存

// 知识点2：每个构造函数(拷贝构造函数除外)都创建一个引用计数，记录对象的共享状态，第一次被新建时，计数为1

// 知识点3：析构函数递减引用计数，拷贝赋值运算符递增右侧对象的引用计数，递减左侧的，当左侧的引用计数为0时，拷贝赋值运算符就必须销毁状态

// 知识点4：计数器不能直接作为类对象的成员，否则在拷贝中，会出现歧义，我们可以将计数器保存在动态内存中，只定义一个指向计数器的指针，这样拷贝或者赋值时，我们拷贝该指针，副本和原对象指向同样的计数器
// class Hasptr1
// {
// public:
// 	//构造函数，初始化相关成员
// 	Hasptr1(const string& s = string()):ps(new string(s)),i(0),use(new size_t(1)){}

// 	//拷贝构造函数，将引用计数也拷贝过来，并且递增引用计数
// 	Hasptr1(const Hasptr1& p):ps(p.ps),i(p.i),use(p.use){++*use;}

// 	//拷贝赋值运算符
// 	Hasptr1& operator= (const Hasptr1& p1)
// 	{
// 		++*p1.use;//首先递增右侧运算符对象的引用计数
// 		if (--*use == 0)//递减本对象的引用计数，若没有其他用户，则释放本对象的成员
// 		{
// 			delete ps;
// 			delete use;
// 		}
// 		ps = p1.ps;//进行拷贝
// 		use = p1.use;
// 		i = p1.i;
// 		return *this;
// 	}

// 	//析构函数
// 	~Hasptr1()
// 	{
// 		if (*use == 0)//引用计数变为0，说明已经没有对象再需要这块内存，进行释放内存操作
// 		{
// 			delete ps;
// 			delete use;
// 		}
// 	}
// private:
// 	//定义为指针，是我们想将该string对象保存在动态内存中
// 	string *ps;
// 	size_t *use;//将计数器的引用保存
// 	int i;
// };